<html>
    <head>
        <title>自定义现有模块</title>
    </head>
    <body>
        <script>
            //  自定义现有模块

                    /*
                        ABP 旨在支持构架完整模块化应用程序和系统。  它还提供了一一些"预构建的应用程序模块"，这些模块可以在任何类型的应用程序中使用。

                        例如， 你可以重用身份管理模块为你的应用程序添加用户、角色、和权限管理。 应用程序启动模板已经预装了 Identity 和 其他模块一样。
                    */

                    /*
                        一、如何重用一个应用程序模块

                                你有两个选项可以重用应用程序模块。

                                    1、作为引用包  As Package Reference

                                            你可以将相关模块的 NuGet & NPM 包引用添加到你的应用程序中，并配置模块（基于其留档）以集成到你的应用程序中。

                                            这种方法有以下好处：

                                                ①、你的解决方案将是干净的并且仅包含你自己的应用程序代码。

                                                ②、当有新版本可用时，你可以轻松升级模块。abp updateCLI命令使其更加容易。通过这种方式，你可以继续获得新功能和bug修复。

                                            但是，也有一个缺点：

                                                你可能无法自定义模块，因为模块源不在你的解决方案中。

                                            本文档解释了如何自定义或扩展依赖的模块二无需更改其源代码。
                                            
                                            虽然与完整的的源代码相比，它是有限的，但是仍有一些好的方法可以进行一些自定义。


                                            如果你不想对预构建的模块进行巨大的更改，那么将它们作为包引用重用是推荐的方法。


                                    2、包括模块源代码

                                            如果你想在预构建的模块上进行巨大的更改或添加主要功能，但可用的扩展点不够，你可以考虑直接使用依赖模块的源代码。

                                            在这种情况下，你通常将模块的源代码添加到你的解决方案中，并将解决方案中的每个包引用替换为其相应的本地项目引用。

                                            ABP CLI的add-module命令使用--with-source-code参数为你自动执行此过程。

                                            如果模块已作为NuGet包安装，此命令还可以用其源代码替换模块。


                                            ★、分离模块解决方案

                                                    你可能不希望将模块源代码直接包含到你的解决方案中。

                                                    每个模块由10多个项目文件组成，添加多个模块可能会影响解决方案加载和开发时间的大小。

                                                    此外，你可能有不同的开发团队在不同的模块上工作，因此你不希望将模块代码提供给应用程序开发团队。

                                                    在任何情况下，你都可以为所需模块创建一个单独的解决方案，并依赖该模块作为解决方案之外的项目引用。我们对abp存储库这样做。

                                                   （我们看到的一个问题是Visual Studio不能很好地使用这种方法（它不能很好地支持引用解决方案目录之外的本地项目）
                                                  
                                                    如果在构建应用程序时出错（取决于外部模块），请在Visual Studio中打开应用程序的解决方案后在命令行中运行dotnet restore。） 
                                                    

                                            ★、将顶住模块发布为NuGet包

                                                    一种替代方案可能是重新打包模块代码 (作为NuGet / NPM 包)并用作包引用。

                                                    例如，你可以为你的公司使用本地私有NuGet/NPM 服务器。
                    */

                    /*
                        二、如何定制、扩展模块

                                如果你决定使用预构建的应用程序模块作为NuGet/NPM包引用，本节建议了一些方法。

                                以下文档解释了如何以不同的方式自定义/扩展现有模块。

                                1、 模块实体扩展系统   Module Entity Extension System

                                        模块实体扩展系统是主要和高级扩展系统,它允许你为依赖模块的现有实体定义新属性.

                                        它自动在单点向实体、数据库、HTTP API和用户交互界面添加属性。

                                        请参阅模块实体扩展文档以了解如何使用它。

                                2、扩展实体  Extending Entities
                               
                                        如果你只需要现有实体上获取/设置额外数据，请按照"扩展实体文档"进行操作。

                                3、重写服务或组件  Overriding Services/Components 

                                        除了可扩展性系统之外，你还可以部分或全部覆盖任何服务或用户交互界面/

                                            ①、重写服务
                                            ②、重写用户界面

                                4、额外的UI库扩展点  Additional UI Extensibility Points

                                        有一些低级系统，你可以控制由模块定义的页面的实体操作、表列和页面工具栏


                                         ①、实体操作扩展 Entity Action ： 
                                             实体操作扩展系统允许你在用户交互界面上为实体的操作菜单添加新操作；
                                                    (1)、asp.net core UI 的实体操作扩展 

                                                    (2)、Blazor UI的实体操作扩展

                                                    (3)、Angular的实体动作扩展

                                         ②、数据表列扩展  Data Table Column Extensions\
                                               数据表列扩展系统允许你在用户交互界面上添加新的数据表列；
                                               
                                                    (1)、asp.net core UI的数据表列扩展 

                                                    (2)、Blazor UI的实体操作扩展

                                                    (3)、Angular的实体动作扩展


                                         ③、Page Toolbar 页面工具栏扩展

                                                    （1）、ASP.NET核心UI的页面工具栏扩展

                                                     (2)、Blazor UI的页面工具栏扩展

                                                     (3)、Angular的页面工具栏扩展

                                                     
                                        
                    */
        </script>
    </body>
</html>